gusucode.com > 同城苏州黄页系统php源码程序 > mod.js/复件 LinkMenu.js
/* ############################################# # # 利用 xmlhttp 实现的无限级 联动菜单 # # alee201@sina.com # ############################################# 一共只有两个函数,一个全局变量。 假设页面里有多个联动菜单, Initialize函数用于初始化 页面中各个联动菜单的 一级菜单, getOption 函数用于在某一级菜单被选择时,装载他的下级菜单。 ServerURL 变量用于记录查询请求提交的地址。 */ // ServerURL 在服务器端负责数据查询的程序的地址。所有查询请求将提交到该地址。 var ServerURL="/mod.php/link-query.php"; /* 函数 str2unicode 将字符串以转换成 unicode ,并插入分隔符。 */ function str2unicode(str) { var strRtn=""; var separator="z"; //file:用z作分隔符 for (var i=0;i<str.length;i++) { strRtn+=str.charCodeAt(i); if (i<str.length-1) strRtn+=separator; } return strRtn; } /* 函数 clearMenu 清空一个菜单 第一个参数是菜单 */ function clearMenu(menu,startIndex) { if(!startIndex) startIndex=1; for (index=menu.length-1;index>=startIndex;index--) { //alert("删除原菜单第"+(index+2)+"项"); menu.options[index]=null;//删除下级菜单中原有的选项,前一次装载的数据需要清空 } } function setSelected(menu,selectedValue) { for(var idx=0;idx<menu.options.length;idx++)//装载新获取的数据到下级菜单 { if( selectedValue>0 && selectedValue == menu.options[idx].value ) menu.options[idx].selected=true } } /* 函数 getOption 菜单选项的查询和装载 参数说明: Parent 上级菜单(select 对象), Select_name 所有下级菜单(数组,元素为 select 对象),数组中的第一个菜单,会根据 Parent 所选择的内容,被装载,其余的清空。 */ function getOption(Parent,Selects,Table,field,queryURL,ifall) { parent_option=Parent.selectedIndex;//上级菜单选中的项的序号 theForm=Parent.form; parentKay=null; if(!Table) Table=Parent.item(parent_option).table; for(key=0;key<theForm.length;key++) { if( theForm[key]==Parent ) { parentKay=key; break; } else continue; } // 获得 Parent 在form中的key for(var key in Selects) { if(typeof(Selects[key])=="object") continue; else if( (typeof(Selects[key])=="string") && (result=Selects[key].match(/^([\-\+])(\d)+$/)) ) { if(result[1]=="+") curentKey=parentKay+eval(result[2]); else if(result[1]=="-") curentKey=parentKay-eval(result[2]); else return false; Selects[key]=theForm[curentKey]; } else return false; } //将全部“-2”类型的参数转换横实际对象 Select=Selects[0]; for(var key in Selects) { clearMenu(Selects[key]); } var Http = new ActiveXObject("Microsoft.XMLHTTP");//创建xmlhttp对象,用于收发数据到服务器短 var Dom = new ActiveXObject("Microsoft.XMLDOM");//创建xmldom对象,用于分析、获取服务器段传回的xml中的数据 if(queryURL) var url=queryURL; else var url=ServerURL; if(!ifall) ifall=0; if( field ) url+="?value="+escape( str2unicode(Parent.item(parent_option).text) )+"&field="+field+"&"+"table="+Table+"&all="+ifall; else url+="?parent="+Parent.item(parent_option).parent+"*"+Parent.item(parent_option).value+"&"+"table="+Table+"&all="+ifall; //alert(url); //out.innerText+=url+"<br>"; //document.write(url); Http.open("GET",url,false); Http.setRequestHeader("CONTENT-TYPE","application/x-www-form-urlencoded");//如果需要 get/post 中文参数到服务器,必须出现次行,否则服务器端出现编码错误。 Http.send();//发送查询信息 Dom.async=false //设置为同步方式获取数据 //alert(Http.responseText); //从服务器端传回的xml信息中,获取数据 Dom.loadXML(Http.responseText); Item = Dom.getElementsByTagName("item"); itemID = Dom.getElementsByTagName("id"); itemName = Dom.getElementsByTagName("name"); itemParent = Dom.getElementsByTagName("parent"); //alert("获取: "+Item.length+"个新的对象"); for(key=0;key<Item.length;key++)//装载新获取的数据到下级菜单 { index=key+1; //alert(itemID[key].text+itemName[key].text+"("+key+":"+Item.length+")"); tempoption=new Option(itemName[key].text,itemID[key].text); Select.options[index]=tempoption; Select.options[index].parent=itemParent[key].text; Select.options[index].table=Table; Select.options[index].value=itemID[key].text; } } /* 函数 Initialize 菜单的初始化 可以一次初始化多个菜单,用数组将联动菜单的第一级菜单 的name,以及所在form传递给本函数。 参数说明: Menus 需要初始化的菜单(数组,元素为完整的表单对象); Table 服务器短 数据库里对应的表(字符串)。 Initialize函数 访问服务器的数据库,到由 Table 参数所指定的数据表里 获取数据,装载到 数组参数 P 所指定的各个菜单里。 */ function Initialize(Menus,Table,selectedValue)//初始化第一个关联菜单 { var url=ServerURL+"?table="+Table+"&parent=0"; document.write("<br>"+url); var Http = new ActiveXObject("Microsoft.XMLHTTP");//创建xmlhttp对象,用于收发数据到服务器短 var Dom = new ActiveXObject("Microsoft.XMLDOM");//创建xmldom对象,用于分析、获取服务器段传回的xml中的数据 Http.open("GET",url,false); Http.setRequestHeader("CONTENT-TYPE","application/x-www-form-urlencoded");//如果需要 get/post 中文参数到服务器,必须出现次行,否则服务器端出现编码错误。 Http.send();//发送查询信息 Dom.async=false //设置为同步方式获取数据 Dom.loadXML(Http.responseText); Item = Dom.getElementsByTagName("item"); itemID = Dom.getElementsByTagName("id"); itemName = Dom.getElementsByTagName("name"); itemParent = Dom.getElementsByTagName("parent"); //document.write("<br>"+"对象:"+Item.length+" name节点:"+itemName.length+" id节点:"+itemID+" parent节点:"+itemParent.length); for(var key=0;key<Item.length;key++)//装载新获取的数据到下级菜单 { index=key+1; for(var menu in Menus) { tempoption=new Option(itemName[key].text,itemID[key].text); Menus[menu].options[index]=tempoption; Menus[menu].options[index].parent=itemParent[key].text; Menus[menu].options[index].table=Table; Menus[menu].options[index].value=itemID[key].text; if( selectedValue>0 && selectedValue == itemID[key].text ) Menus[menu].options[index].selected=true } } } function InitMore(Menus,values,DB_table_name) { // 初始化第一個菜單 Initialize(new Array(Menus[0]),DB_table_name,values[0]) // 循環初始化 以後的菜單 for(idx=1;idx<Menus.length;idx++) { // 裝載菜單 getOption(Menus[idx-1],new Array(Menus[idx])) // 默認項 setSelected(Menus[idx],values[idx]) } }